package cn.iocoder.yudao.module.product.api.storespu;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.product.api.spu.ProductSpuApi;
import cn.iocoder.yudao.module.product.api.spu.dto.ProductSpuRespDTO;
import cn.iocoder.yudao.module.product.api.storespu.dto.StoreSpuRespDTO;
import cn.iocoder.yudao.module.product.dal.dataobject.spu.ProductSpuDO;
import cn.iocoder.yudao.module.product.dal.dataobject.storespu.StoreSpuDO;
import cn.iocoder.yudao.module.product.dal.mysql.spu.ProductSpuMapper;
import cn.iocoder.yudao.module.product.dal.mysql.storespu.StoreSpuMapper;
import cn.iocoder.yudao.module.product.enums.storespu.StoreSpuStatusEnum;
import cn.iocoder.yudao.module.trade.api.store.StoreApi;
import cn.iocoder.yudao.module.trade.api.store.dto.StoreRespDTO;
import com.google.common.collect.Lists;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

@Service
@Validated
public class StoreSpuApiImpl implements StoreSpuApi {

    @Resource
    private StoreSpuMapper storeSpuMapper;
    @Resource
    @Lazy
    private ProductSpuApi productSpuApi;
    @Resource
    private StoreApi storeApi;
    @Resource
    private ProductSpuMapper productSpuMapper;

    @Override
    public void initStoreSpuByStoreId(Long storeId) {
        if (storeId == null) {
            return;
        }
        List<StoreRespDTO> storeList = storeApi.getStoreList(Lists.newArrayList(storeId));
        if (CollUtil.isEmpty(storeList)) {
            return;
        }
        StoreRespDTO storeRespDTO = storeList.get(0);
        List<StoreSpuDO> storeSpuDOS = storeSpuMapper.selectList(StoreSpuDO::getStoreId, storeId);
        if (CollUtil.isNotEmpty(storeSpuDOS)) {
            storeSpuMapper.deleteBatchIds(storeSpuDOS.stream().map(StoreSpuDO::getId).collect(Collectors.toList()));
        }
        if (Objects.equals(0, storeRespDTO.getStatus())) {
            List<ProductSpuRespDTO> enableSpuList = productSpuApi.getEnableSpuList();
            enableSpuList.forEach(e -> {
                StoreSpuDO storeSpuDO = new StoreSpuDO();
                storeSpuDO.setStoreId(storeId);
                storeSpuDO.setProductSpuId(e.getId());
                storeSpuDO.setSort(1);
                storeSpuDO.setStatus(1);
                storeSpuMapper.insert(storeSpuDO);
            });
        }
    }

    @Override
    public void initStoreSpuByProductSpuId(Long productSpuId) {
        if (productSpuId == null) {
            return;
        }
        ProductSpuDO productSpuDO = productSpuMapper.selectById(productSpuId);
        if (productSpuDO == null) {
            return;
        }
        List<StoreSpuDO> storeSpuDOS = storeSpuMapper.selectList(StoreSpuDO::getProductSpuId, productSpuId);
        if (CollUtil.isNotEmpty(storeSpuDOS)) {
            storeSpuMapper.deleteBatchIds(storeSpuDOS.stream().map(StoreSpuDO::getId).collect(Collectors.toList()));
        }
        if (Objects.equals(1, productSpuDO.getStatus())) {
            List<StoreRespDTO> enableStoreList = storeApi.getEnableStoreList();
            enableStoreList.forEach(e -> {
                StoreSpuDO storeSpuDO = new StoreSpuDO();
                storeSpuDO.setStoreId(e.getId());
                storeSpuDO.setProductSpuId(productSpuId);
                storeSpuDO.setSort(1);
                storeSpuDO.setStatus(1);
                storeSpuMapper.insert(storeSpuDO);
            });
        }
    }

    @Override
    public List<StoreSpuRespDTO> getStoreEnableSpu(Long storeId) {
        if (storeId == null) {
            return Lists.newArrayList();
        }
        return BeanUtils.toBean(storeSpuMapper.selectList(StoreSpuDO::getStoreId, storeId, StoreSpuDO::getStatus, StoreSpuStatusEnum.ENABLE.getStatus()), StoreSpuRespDTO.class);
    }

}
